package com.ruoyi.system.service.aggregation.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.service.aggregation.ISalesmanNoService;
import com.ruoyi.system.mapper.aggregation.UserMapper;
import com.ruoyi.common.utils.StringUtils;

/**
 * 业务员编号生成服务实现
 * 
 * @author ruoyi
 * @date 2025-01-10
 */
@Service
public class SalesmanNoServiceImpl implements ISalesmanNoService 
{
    @Autowired
    private UserMapper userMapper;

    /**
     * 生成下一个业务员编号
     * 格式：00000001, 00000002, ..., 00099999
     * 
     * @return 8位业务员编号
     */
    @Override
    public String generateNextSalesmanNo()
    {
        String maxNo = getMaxSalesmanNo();
        int nextNumber;
        
        if (StringUtils.isEmpty(maxNo)) {
            // 如果没有现有编号，从00000001开始
            nextNumber = 1;
        } else {
            try {
                // 解析现有最大编号并加1
                nextNumber = Integer.parseInt(maxNo) + 1;
            } catch (NumberFormatException e) {
                // 如果解析失败，从1开始
                nextNumber = 1;
            }
        }
        
        // 格式化为8位数字，不足补0
        return String.format("%08d", nextNumber);
    }

    /**
     * 获取当前最大业务员编号
     * 
     * @return 当前最大编号，如果没有则返回null
     */
    @Override
    public String getMaxSalesmanNo()
    {
        return userMapper.selectMaxSalesmanNo();
    }

    /**
     * 验证业务员编号格式
     * 
     * @param salesmanNo 业务员编号
     * @return 是否有效
     */
    @Override
    public boolean isValidSalesmanNo(String salesmanNo)
    {
        if (StringUtils.isEmpty(salesmanNo)) {
            return false;
        }
        
        // 检查是否为8位数字
        if (!salesmanNo.matches("^\\d{8}$")) {
            return false;
        }
        
        // 检查编号范围（00000001 - 99999999）
        try {
            int number = Integer.parseInt(salesmanNo);
            return number >= 1 && number <= 99999999;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    /**
     * 检查业务员编号是否已存在
     * 
     * @param salesmanNo 业务员编号
     * @return 是否存在
     */
    @Override
    public boolean isSalesmanNoExists(String salesmanNo)
    {
        if (!isValidSalesmanNo(salesmanNo)) {
            return false;
        }
        
        return userMapper.selectSalesmanNoExists(salesmanNo) > 0;
    }
}
